﻿using Library.AppWeb;
using MPR.Poker.Model.SYS;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MPR.Poker.DALEntity.SYS
{
    public class DAL_TournamentStep
    {
        public DAL_TournamentStep()
        {
        }

        #region Insert/Update/Delete

        /// <summary>
        /// Thêm mới Step giải đấu
        /// </summary>
        /// <param name="objTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage Insert(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                objResultMessage = CheckExist(objTournamentStep);
                if (objResultMessage.IsError) return objResultMessage;

                objResultMessage = InsertNoCheck(objTournamentStep);
                if (objResultMessage.IsError) return objResultMessage;
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Insert, "Lỗi thêm Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> Insert");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Thêm Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Cập nhật Step giải đấu
        /// </summary>
        /// <param name="objTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage Update(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                objResultMessage = CheckExist(objTournamentStep);
                if (objResultMessage.IsError) return objResultMessage;

                objResultMessage = UpdateNoCheck( objTournamentStep);
                if (objResultMessage.IsError) return objResultMessage;
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Insert, "Lỗi cập nhật Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> Update");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Cập nhật Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Xóa Step giải đấu
        /// </summary>
        /// <param name="strTournamentStepID"></param>
        /// <returns></returns>
        public ResultMessage Delete(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckRelationship(objTournamentStep);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = DeleteNoCheck(objTournamentStep);

            return objResultMessage;
        }

        /// <summary>
        /// Xóa Step giải đấu
        /// </summary>
        /// <param name="intTournamentStepIDSys">Mã Step giải đấu</param>
        /// <param name="intDeletedTournamentStep">Mã Step giải đấu</param>
        /// <returns></returns>
        public ResultMessage Delete(int intTournamentStepIDSys, int intDeletedTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            SYS_TournamentStep objTournamentStep = new SYS_TournamentStep();
            objTournamentStep.IDSys = intTournamentStepIDSys;

            objResultMessage = CheckRelationship(objTournamentStep);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = DeleteNoCheck(objTournamentStep);

            return objResultMessage;
        }

        /// <summary>
        /// Xóa Step giải đấu
        /// </summary>
        /// <param name="lstTournamentStepIDSys">List đối tượng Step giải đấu</param>
        /// <param name="intDeletedTournamentStep">Mã Step giải đấu</param>
        /// <returns></returns>
        public ResultMessage Delete(List<int> lstTournamentStepIDSys, int intDeletedTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();

            foreach (int IDSys in lstTournamentStepIDSys)
            {
                SYS_TournamentStep objTournamentStep = new SYS_TournamentStep();
                objTournamentStep.IDSys = IDSys;

                objResultMessage = CheckRelationship(objTournamentStep);
                if (objResultMessage.IsError) return objResultMessage;

                objResultMessage = DeleteNoCheck(objTournamentStep);
                if (objResultMessage.IsError) return objResultMessage;
            }

            return objResultMessage;
        }

        /// <summary>
        /// Kiềm tra tồn tại Step giải đấu
        /// </summary>
        /// <param name="strID"></param>
        /// <param name="strTournamentStepID"></param>
        /// <returns></returns>
        public ResultMessage CheckExist(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            SYS_TournamentStep TournamentStep = new SYS_TournamentStep();

            try
            {
                //using (PokerLife db = new PokerLife())
                //{
                //    TournamentStep = db.SYS_TournamentSteps.FirstOrDefault(i => i.IsDeleted == false & i.TournamentStepName == objTournamentStep.TournamentStepName & i.IDSys != objTournamentStep.IDSys);

                //    if (TournamentStep != null && TournamentStep.TournamentStepName.Trim().Length > 0)
                //    {
                //        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Step giải đấu đã tồn tại", string.Empty);
                //    }
                //}
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Lỗi kiểm tra tồn tại Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> CheckExist");
                return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Kiểm tra dữ liệu liên quan
        /// </summary>
        /// <param name="strTournamentStepID"></param>
        /// <returns></returns>
        public ResultMessage CheckRelationship(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                //using (PokerLife db = new PokerLife())
                //{
                //    SYS_TournamentStep user = db.SYS_TournamentSteps.FirstOrDefault(i => i.TournamentStepGroupIDSys == objTournamentStepGroup.IDSys);

                //    if (user != null && user.UID.Trim().Length > 0)
                //    {
                //        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.No_Error, "Có dữ liệu liên quan đến nhóm Step giải đấu", string.Empty);
                //    }
                //}
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Lỗi kiểm tra dữ liệu liên quan Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> CheckRelationship");
                return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Thêm mới Step giải đấu không cần kiểm tra
        /// </summary>
        /// <param name="objTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage InsertNoCheck(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            SYS_TournamentStep TournamentStep = new SYS_TournamentStep();

            try
            {
                Library.DataAccess.IData objIData = Library.DataAccess.Data.CreateData(DAL_Globals.ConnectString);
                objIData.ConnectNoEncrypt();
                SqlParameter[] para = new SqlParameter[10];
                para[0] = new SqlParameter("@StepName", objTournamentStep.StepName);
                para[1] = new SqlParameter("@ImageUrl", objTournamentStep.ImageUrl);
                para[2] = new SqlParameter("@TournamentIDSys", objTournamentStep.TournamentIDSys);
                para[3] = new SqlParameter("@MinPlayerNumber", objTournamentStep.MinPlayerNumber);
                para[4] = new SqlParameter("@MaxPlayerNumber", objTournamentStep.MaxPlayerNumber);
                para[5] = new SqlParameter("@MinTableNumber", objTournamentStep.MinTableNumber);
                para[6] = new SqlParameter("@MaxTableNumber", objTournamentStep.MaxTableNumber);
                para[7] = new SqlParameter("@PriceTable", objTournamentStep.PriceTable);
                para[8] = new SqlParameter("@PriceBuy", objTournamentStep.PriceBuy);
                para[9] = new SqlParameter("@Note", objTournamentStep.Note);

                objIData.CreateStoredProcedue("sp_SYS_TournamentStep_ADD");
                objIData.AddParameter(para);
                objIData.ExecProcedure();

                DAL_Event.Insert("Thêm mới Step giải đấu - " + TournamentStep.StepName.ToString(), 0, ResultMessage.ErrorTypes.Insert.ToString());
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Insert, "Lỗi thêm Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> Insert");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Thêm Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Cập nhật Step giải đấu không cần kiểm tra
        /// </summary>
        /// <param name="objTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage UpdateNoCheck(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                Library.DataAccess.IData objIData = Library.DataAccess.Data.CreateData(DAL_Globals.ConnectString);
                objIData.ConnectNoEncrypt();
                SqlParameter[] para = new SqlParameter[11];
                para[0] = new SqlParameter("@IDSys", objTournamentStep.IDSys);
                para[1] = new SqlParameter("@StepName", objTournamentStep.StepName);
                para[2] = new SqlParameter("@ImageUrl", objTournamentStep.ImageUrl);
                para[3] = new SqlParameter("@TournamentIDSys", objTournamentStep.TournamentIDSys);
                para[4] = new SqlParameter("@MinPlayerNumber", objTournamentStep.MinPlayerNumber);
                para[5] = new SqlParameter("@MaxPlayerNumber", objTournamentStep.MaxPlayerNumber);
                para[6] = new SqlParameter("@MinTableNumber", objTournamentStep.MinTableNumber);
                para[7] = new SqlParameter("@MaxTableNumber", objTournamentStep.MaxTableNumber);
                para[8] = new SqlParameter("@PriceTable", objTournamentStep.PriceTable);
                para[9] = new SqlParameter("@PriceBuy", objTournamentStep.PriceBuy);
                para[10] = new SqlParameter("@Note", objTournamentStep.Note);

                objIData.CreateStoredProcedue("sp_SYS_TournamentStep_UPD");
                objIData.AddParameter(para);
                objIData.ExecProcedure();

                DAL_Event.Insert("Cập nhật Step giải đấu - " + objTournamentStep.StepName.ToString(), 0, ResultMessage.ErrorTypes.Update.ToString());
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Update, "Lỗi cập nhật Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> Update");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Cập nhật Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Xóa Step giải đấu không cần kiểm tra
        /// </summary>
        /// <param name="objTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage DeleteNoCheck(SYS_TournamentStep objTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    SYS_TournamentStep TournamentStep = db.SYS_TournamentSteps.FirstOrDefault(i => i.IDSys == objTournamentStep.IDSys);
                    if (TournamentStep == null || TournamentStep.IDSys == 0)
                    {
                        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Step giải đấu không tồn tại", string.Empty);
                        return objResultMessage;
                    }

                    TournamentStep.IsDeleted = true;
                    TournamentStep.DeletedDate = DateTime.Now;

                    db.SaveChanges();
                }

                DAL_Event.Insert("Xóa Step giải đấu - " + objTournamentStep.StepName.ToString(), 0, ResultMessage.ErrorTypes.Delete.ToString());

            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Delete, "Lỗi xóa Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> DeleteNoCheck");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Xóa Step giải đấu thành công", string.Empty);
        }               

        #endregion

        #region Load/Search/Select

        /// <summary>
        /// Lấy thông tin Step giải đấu
        /// </summary>
        /// <param name="objTournamentStep"></param>
        /// <param name="strID"></param>
        /// <returns></returns>
        public ResultMessage LoadInfo(ref SYS_TournamentStep objTournamentStep, Int64 intTournamentStepIDSys)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                Library.DataAccess.IData objIData = Library.DataAccess.Data.CreateData(DAL_Globals.ConnectString);
                objIData.ConnectNoEncrypt();
                objIData.CreateStoredProcedue("sp_SYS_TournamentStep_SEL");
                objIData.AddParameter("@IDSys", intTournamentStepIDSys);

                DataTable dt = objIData.GetDataTableProcedure();
                objTournamentStep = Library.AppWeb.ConvertData.ConvertToModel<SYS_TournamentStep>(dt);

            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.LoadInfo, "Lấy thông tin Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> LoadInfo");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy thông tin Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Step giải đấu
        /// </summary>
        /// <param name="dtTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage SearchData(ref DataTable dtTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            dtTournamentStep = new DataTable();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    dtTournamentStep = ConvertData.ConvertToDataTable<SYS_TournamentStep>(db.SYS_TournamentSteps.Where(i => i.IsDeleted == false).ToList());
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SearchData, "Lấy thông tin Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> LoadInfo");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Step giải đấu dạng List
        /// </summary>
        /// <param name="lstTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<SYS_TournamentStep> lstTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var TournamentStep = from gu in db.SYS_TournamentSteps
                               where gu.IsDeleted == false
                               orderby gu.OrderIndex
                               select gu;
                    lstTournamentStep = TournamentStep.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy thông tin Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Step giải đấu dạng List
        /// </summary>
        /// <param name="lstTournamentStep">Đối tượng Step giải đấu</param>
        /// <param name="intPageSize">Số lượng Record một trang</param>
        /// <param name="intPageNumber">Lấy trang số mấy</param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<SYS_TournamentStep> lstTournamentStep, int intPageSize, int intPageNumber)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var TournamentStep = from gu in db.SYS_TournamentSteps
                               where gu.IsDeleted == false
                               orderby gu.OrderIndex
                               select gu;

                    lstTournamentStep = TournamentStep.Skip((intPageNumber - 1) * intPageSize).Take(intPageSize).ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy thông tin Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Step giải đấu để Cache
        /// </summary>
        /// <param name="lstTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage SelectToCache(ref List<SYS_TournamentStep> lstTournamentStep,int intTournamentIDSys)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                Library.DataAccess.IData objIData = Library.DataAccess.Data.CreateData(DAL_Globals.ConnectString);
                objIData.ConnectNoEncrypt();
                SqlParameter[] para = new SqlParameter[1];
                para[0] = new SqlParameter("@TournamentIDSys", intTournamentIDSys);

                objIData.CreateStoredProcedue("sp_SYS_TournamentStep_SRH");
                objIData.AddParameter(para);
                DataTable dt = objIData.GetDataTableProcedure();

                lstTournamentStep = Library.AppWeb.ConvertData.ConvertToList<SYS_TournamentStep>(dt);
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy Cache danh sách Step giải đấu", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_TournamentStep --> SelectToListCache");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy Cache danh sách Step giải đấu thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Step giải đấu từ Cache
        /// </summary>
        /// <param name="lstTournamentStep"></param>
        /// <returns></returns>
        public ResultMessage SelectToListCache(ref List<SYS_TournamentStep> lstTournamentStep)
        {
            ResultMessage objResultMessage = new ResultMessage();
            //objResultMessage = MPR.Poker.DALEntity.DataCache.GetDataCache.GetTournamentStep(ref lstTournamentStep);
            return objResultMessage;
        }

        #endregion
    }
}
